package ar.com.arkios.kfcon4d.dao;

import ar.com.arkios.j4d.opConstants;
import ar.com.arkios.j4d.opException;
import ar.com.arkios.j4d.opProcess;
import ar.com.arkios.j4d.opServerProcess;
import ar.com.arkios.j4d.opServerProcessArray;
import ar.com.arkios.j4d.opVariable;
import ar.com.arkios.kfcon4d.Connection4D;
import ar.com.arkios.kfconmodelo.modelo.BultoPorEmbalador;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import org.apache.log4j.Logger;

public class BultosXEmbaDAO {
    
    private static final Logger miLogger = Logger.getLogger(BultosXEmbaDAO.class);
    
    /** Conección a 4D */
    private Connection4D miConexion;
    
    /** 
     * Proceso a través del cual se ejecutan las consultas a la base de datos 
     * de 4D.
     */
    private opProcess miProceso;
    private opServerProcess miStoreProc;

    public BultosXEmbaDAO() {
        miConexion = Connection4D.getInstance();
        miProceso = miConexion.getMyProcess();
        try {
            opServerProcessArray losProc = miProceso.GetProcessList();
            for (opServerProcess proc : losProc.mServerProcessArray) {
                if (proc.mProcessName.equals("ExpoStoredProc")) {
                    miProceso.GetProcessNumber(proc);
                    miStoreProc = proc;
                    break;
                }
            }
        } catch (opException ex) {
            miLogger.error("No se pudo establecer conexión a StoredProcedure: "+ex.GetErrorMsg());
        }
    }

    public BultosXEmbaDAO(opServerProcess miStoreProc) {
        miConexion = Connection4D.getInstance();
        miProceso = miConexion.getMyProcess();
        this.miStoreProc = miStoreProc;
    }
    
    public List<BultoPorEmbalador> getBxE () throws opException {
        List<BultoPorEmbalador> resultado = null;
        
        opVariable miVar = new opVariable(opConstants.VPROCESS, "BXE_sNroCaja");
        String[] nroCaja = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_dFechaCaja");
        GregorianCalendar[] fecha = miProceso.GetProcessArrayDate(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_sSalidaCaja");
        String[] salida = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_sVariedadCaja");
        String[] variedad = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_sEnvaseCaja");
        String[] envase = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_sEmbalajeCaja");
        String[] embalaje = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_sMarcaCaja");
        String[] marca = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_sCategoriaCaja");
        String[] categoria = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_sTamanioCaja");
        String[] calibre = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_sEspecieCaja");
        String[] especie = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_sEmpleadoCodCaja");
        String[] empNro = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_sEmpleadoNombreCaja");
        String[] empNombre = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_lEmpleadoLegajoCaja");
        int[] empLegajo = miProceso.GetProcessArrayInt(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_iEmpleadoCatCaja");
        int[] empCategoria = miProceso.GetProcessArrayInt(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_sLoteNroCaja");
        String[] loteNro = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_rPesoEstandarCaja");
        double[] peso = miProceso.GetProcessArrayReal(miStoreProc, miVar);

        miVar = new opVariable(opConstants.VPROCESS, "BXE_sOpCajaCaja");
        String[] opcaja = miProceso.GetProcessArrayString(miStoreProc, miVar);


        resultado = new ArrayList<BultoPorEmbalador>(nroCaja.length);
        for (int i = 0; i < nroCaja.length; i++) {
            BultoPorEmbalador bxe = new BultoPorEmbalador();
            
            bxe.setMiCajaCod(nroCaja[i]);
            bxe.setMiFecha(fecha[i].getTime());
            bxe.setMiTambor(salida[i]);
            bxe.setMiVariedadCod(variedad[i]);
            bxe.setMiEnvaseCod(envase[i]);
            bxe.setMiEmbalajeCod(embalaje[i]);
            bxe.setMiMarcaCod(marca[i]);
            bxe.setMiCalidadCod(categoria[i]);
            bxe.setMiCalibreCod(calibre[i]);
            bxe.setMiEspecieCod(especie[i]);
            try {
                bxe.setMiEmbaladorNum(Long.parseLong(empNro[i]));
            } catch (NumberFormatException e) {
                bxe.setMiEmbaladorNum(0);
            }
            bxe.setMiEmpleadoNombreyApellido(empNombre[i]);
            bxe.setMiEmpleadoLegajo(empLegajo[i]);
            bxe.setMiEmpleadoCategoria(empCategoria[i]);
            bxe.setMiLoteNum(loteNro[i]);
            bxe.setMiNumeroOrden(opcaja[i]);
            
            resultado.add(bxe);
        }
        
        return resultado;
    }
}